/*
 *
 *
20.2 二维数组在函数间传参
1. 形参声明为一级指针
void fun(int *, int, int); //假设a[2][3]，第一个参数传入a[0](列指针即一级指针)，第二、三个参数传入数组的行和列的大小
2. 形参声明为行指针（二维数组）,以下两种形式均可。
void fun(int array[][M], int, int);
void fun(int (*array)[M], int, int)；
3. 形参声明为二级指针
void fun(int **, int, int);


 1 2 3 4 
5 6 7 8 
9 10 11 12 
Odd Number Count : 6
Odd Number Count : 6
Odd Number Count : 6

 */
#include<stdio.h>

const int M = 4;

void print_array(int *a, int n, int m);
void get_odd(int (*a)[M], int n, int m);
void get_odd2(int a[][M], int n, int m);
void get_odd3(int ** a, int n, int m);

int main(){
	int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

	print_array(a[0],3,4);
	get_odd(a,3,4);
	get_odd2(a,3,4);
	//程序报错：段错误：此时a是行指针，形参是二级指针。函数会认为数组中元素的值是地址，导致报错
	//get_odd3(a,3,4);
	//正确写法:先构造一个二级指针
	int *p[3] = {a[0], a[1], a[2]};
	get_odd3(p,3,4);
	return 0;
}

void print_array(int *a, int n, int m){
	for(int i = 0; i < n*m; i++){
		printf("%d ",*(a + i));
		if((i+1) % 4 == 0){
			putchar('\n');
		}
	}
}


void get_odd(int (*a)[M], int n, int m){
	int count = 0;
	for(int i = 0; i < n ; i++){
		for(int j = 0; j < m; j++){
			if(a[i][j] % 2 != 0){
				count++;
			}
		}
	}
	printf("Odd Number Count : %d\n",count);
}
void get_odd2(int a[][M], int n, int m){
	int count = 0;
	for(int i = 0; i < n ; i++){
		for(int j = 0; j < m; j++){
			if(a[i][j] % 2 != 0){
				count++;
			}
		}
	}
	printf("Odd Number Count : %d\n",count);
}
void get_odd3(int **a, int n, int m){
	int count = 0;
	for(int i = 0; i < n ; i++){
		for(int j = 0; j < m; j++){
			if(a[i][j] % 2 != 0){
				count++;
			}
		}
	}
	printf("Odd Number Count : %d\n",count);
}
